<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      // 规则 1：NaN和其他任何类型比较永远返回false（包括和他自己）
      // 规则 2：Boolean 和其他任何类型比较，Boolean 首先被转换为 Number 类型。
      // 规则 3：String和Number比较，先将String转换为Number类型
      // 规则 4：null == undefined比较结果是true，除此之外，null、undefined和其他任何结果的比较值都为false。
      // 规则 5：原始类型和引用类型做比较时，引用类型会依照ToPrimitive规则转换为原始类型。
      //   ToPrimitive规则，是引用类型向原始类型转变的规则，它遵循先 valueOf后 toString的模式期望得到一个原始类型。
      // '0' == false // true   因为'0'被抓换为0，false转换成0
      // ['0'] == false // true   因为['0']被tostring为'0'，false转换成0
      // [2] == 2  // true  因为[2] 在比较时会被转换为 "2"，然后 "2" 会被转换为数字 2，
      // [] == false // ?  因为[] 被转换为空字符串 ""，然后 "" 被转换为数字 0，与 false 转换后的 0 进行比较
      // [null] == 0 // ? true
      // [null] == false // ? true
      // [undefined] == false // ? true  [undefined]通过toString变成 ''
      // undefined == false // ?true    undefined 只与 null 相等
      // null == 0 // ?false   null 仅与 undefined 相等
      // null == false // ?false
      // true + false // ? 1
      // "number" + 15 + 3 // ? number153
      // 100 + true + 21.2 + null + undefined + "Tencent" + [] + null + 9 + false //
      // ?NaNTencentnull9false
      // null 转换为数字时为 0。
      // undefined 转换为数字时为 NaN。
      // {} + [] + {} + [1] // ? [object Object][object Object]1
      // ! + [] + [] + ![] // ? "truefalse"
      // [1] > null // ?true
      // "foo" + + "bar" // ? fooNaN
      // 0 || "0" && {} // ?{}
      // [1,2,3] == [1,2,3] // ?false
      // []+{} // ?[object Object]
      // ++[[]][+[]]+[+[]] // ?//10

      console.log(++[[]][+[]] + [+[]]);
    </script>
  </body>
</html>
